﻿/**
 * Project: IMPAuto SDK
 * Company: NavInfo Co.,Ltd.
 * All rights reserved
 * (c) Copyright 2020
 */

#ifndef	NICOORDCONV_H
#define	NICOORDCONV_H

namespace Navinfo {
namespace IMPAuto {
namespace Util {

/**
	@brief		坐标转换工具类。用于NI坐标与度分秒坐标之间的转换。
	@details
*/
class CNICoordConv
{
public:
	
	/**
		@brief			NI坐标转经纬度
		@param [in]		iCoord		NI坐标
		@return			度
		@details
	*/
	static double NICoord2Degree( int iCoord )
	{
		return ((double)iCoord) / 2147483648.0 * 180.0;
	}

	/**
		@brief			经纬度转NI坐标
		@param [in]		d		度
		@return			NI坐标
		@details
	*/
	static int Degree2NICoord( double d )
	{
		return d / 180.0 * 2147483648.0;
	}

	/**
		@brief			NI坐标转度分秒
		@param [in]		iCoord		NI坐标
		@param [out]	d			度
		@param [out]	m			分
		@param [out]	s			秒
		@param [out]	ms			毫秒
		@details
	*/
	static void NICoord2DMS( int iCoord, int &d, int &m, int &s, int &ms )
	{
		const int	dd	=	(int)( 2147483648.0 / 180 );
		const int	mm	=	(int)( 2147483648.0 / 180 / 60 );
		const int	ss	=	(int)( 2147483648.0 / 180 / 60 / 60 );
		const int	mss	=	(int)( 2147483648.0 / 180 / 60 / 60 / 1000 );
		d	=	iCoord / dd;
		m	=	( iCoord % dd ) / mm;
		s	=	( ( iCoord % dd ) % mm ) / ss;
		ms	=	( ( ( iCoord % dd ) % mm ) % ss ) / mss;
	}

	/**
		@brief			度分秒转NI坐标
		@param [in]		d			度
		@param [in]		m			分
		@param [in]		s			秒
		@param [in]		ms			毫秒
		@param [out]	iCoord		NI坐标
		@details
	*/
	static void DMS2NICoord( int d, int m, int s, int ms, int &iCoord )
	{
		const int	dd	=	(int)( 2147483648.0 / 180 );
		const int	mm	=	(int)( 2147483648.0 / 180 / 60 );
		const int	ss	=	(int)( 2147483648.0 / 180 / 60 / 60 );
		const int	mss	=	(int)( 2147483648.0 / 180 / 60 / 60 / 1000 );
		iCoord	=	d * dd + m * mm + s * ss + ms * mss;
	}
};

}	//	namespace Util
}	//	namespace IMPAuto
}	//	namespace Navinfo

#endif	//	NICOORDCONV_H
